// 实现一个栈，该栈带有出栈（pop）、入栈（push）、取最小元素（getMin）3个方法。要保证这3个方法的时间复杂度都是O（1）。
class Stack {
    constructor(n) {
      this.arr = new Array(n); // 存储栈数据
      this.top = -1; // 栈顶指针指向栈顶数据
      this.max = n;
    }
    // 入栈
    push(value) {
        // 栈顶指针向上移动一位，
        // 放入元素
        if(this.full()) return;
        this.arr[++this.top] = value;
    }
  
  // 出栈
  pop() {
    if(this.empty()) return;
    // 栈顶置针向下移动一位
    // 返回旧的栈顶元素
    return this.arr[this.top--];
  }
  
  // 查看栈顶元素
  peek() {
    return this.arr[this.top];
  }
  
  // 判空
  empty() {
    return this.top === -1;
  }
  full() {
    return this.top  >= this.max - 1;
  }
  size() {
    return this.top + 1;
  }
}
  
class MyStack {
    constructor(n) {
      this.mainStack = new Stack(n); // 存储栈数据
      this.minStack = new Stack(n); // 存储最小栈数据
    }
    // 入栈
    push(value) {
        this.mainStack.push(value);
        if(this.minStack.empty() || value <= this.minStack.peek()) {
          this.minStack.push(value);
        }
    }
  
  // 出栈
  pop() {
     // 如果出栈元素为最小元素，将最小栈的栈顶元素出栈
     if(this.mainStack.peek() === this.minStack.peek()) {
       this.minStack.pop();
     }
     return this.mainStack.pop();
  }
  // 查看栈顶元素
  peek() {
    return this.mainStack.peek();
  }
  getMin() {
    return this.minStack.peek();
  }
}

function test() {
    let stack = new MyStack(6);
    stack.push(1);
    stack.push(2);
    stack.pop();
    stack.push(3);
    stack.push(4);
    stack.push(5);
    stack.push(6);
    console.log(stack.getMin());
}
test();